package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

type User struct {
	Name     string `json:"name"`
	Password string `json:"password"`
}

func main() {
	r := gin.Default()
	r.POST("/auth", authHandler)
	r.GET("/home", JWTAuthMiddleware(), homeHandler)
	r.Run(":8080")
}
func authHandler(c *gin.Context) {
	var user User
	err := c.BindJSON(&user)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 2001,
			"msg":  "无效的参数",
		})
		return
	}
	// 校验用户名和密码是否正确
	if user.Name == "ybl" && user.Password == "123" {
		// 生成Token
		tokenString, _ := GenerateToken(user.Name)
		c.JSON(http.StatusOK, gin.H{
			"code": 200,
			"msg":  "success",
			"data": gin.H{"token": tokenString},
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": 2002,
		"msg":  "鉴权失败",
	})
	return
}
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// 这里的具体实现方式要依据你的实际业务情况决定
		tokenString := c.GetHeader("Authorization")
		//验证token的格式 ，如果token为空或者不是以Bearer 开头 注意这里有空格
		if tokenString == "" || strings.HasPrefix(tokenString, "Bearer ") {
			c.IndentedJSON(http.StatusUnauthorized, gin.H{
				"code": 401, "msg": "权限不足",
			})
			c.Abort()
			return
		}
		//如果格式正确
		tokenString = tokenString[7:] //bearer 占了7位 截取后面的真正token
		claims, err := ParaseToken(tokenString)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 2005,
				"msg":  "无效的Token",
			})
			c.Abort()
			return
		}
		c.Set("username", claims.Username) // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息
		c.Next()
	}
}
func homeHandler(c *gin.Context) {
	username, _ := c.Get("username")
	c.IndentedJSON(200, gin.H{
		"code": 200,
		"data": username,
	})
}
